<?php

namespace App\Http\Controllers;

use App\Services\OssStorageService; // 引入新的服务类
use Illuminate\Http\Request;
// use OSS\OssClient; // 不再直接依赖 OssClient
use OSS\Core\OssException;
use Illuminate\Support\Facades\Log; // 保留 Log 用于控制器级别的错误记录 (如果需要)

class UploadController extends Controller
{
    /**
     * OSS 存储服务实例。
     * @var OssStorageService
     */
    protected $ossService;

    // 不再需要 $bucket 属性
    // protected $bucket;

    /**
     * 控制器构造函数。
     *
     * 通过 Laravel 的服务容器自动注入 OssStorageService 实例。
     *
     * @param OssStorageService $ossService
     */
    public function __construct(OssStorageService $ossService)
    {
        $this->ossService = $ossService;
        // 不再需要直接获取 bucket 或注入 OssClient
        // $this->ossClient = $ossClient;
        // $this->bucket = Config::get('oss.bucket');
        // if (empty($this->bucket)) {
        //     throw new \InvalidArgumentException('OSS bucket configuration is missing.');
        // }
    }

    /**
     * 处理文件上传请求。
     *
     * @param Request $request Laravel 的 HTTP 请求对象，包含上传的文件信息
     * @return \Illuminate\Http\JsonResponse 返回包含上传结果的 JSON 响应
     */
    public function upload(Request $request)
    {
        // 1. 验证上传的文件
        // 添加验证规则：必须是文件，且 MIME 类型是 jpg, jpeg, png, 或 pdf
        // 你可以根据需要调整允许的 MIME 类型列表
        // 例如，只允许图片: 'mimes:jpg,jpeg,png,gif'
        // 例如，允许文档和图片: 'mimes:jpg,jpeg,png,gif,pdf,doc,docx'
        // 查看 Laravel 文档了解更多验证规则: https://laravel.com/docs/validation#rule-mimes
        $validated = $request->validate([
            'file' => 'required|file|mimes:jpg,jpeg,png,pdf|max:10240', // 限制为 10MB
        ]);

        // 从验证过的数据中获取文件对象
        $file = $validated['file']; // 或者 $request->file('file') 也可以

        try {
            // 2. 调用服务类处理文件上传
            // 第二个参数可以传递自定义的基础目录，例如 'avatars' 或 'documents'
            $uploadResult = $this->ossService->uploadFile($file); // 默认上传到 'uploads/' 目录下


            // 3. 返回成功响应
            return response()->json([
                'message' => 'File uploaded successfully',
                'object_name' => $uploadResult['object_name'],
                'oss_info' => $uploadResult['oss_info'], // 从服务返回的信息中获取
                'url' => $uploadResult['url'],       // 从服务返回的信息中获取
            ]);

        } catch (OssException $e) {
            // 4. 处理服务抛出的 OSS 异常
            // 服务类已经记录了日志，这里只需要返回错误响应
            return response()->json(['error' => 'Failed to upload file to OSS: ' . $e->getMessage()], 500);
        } catch (\InvalidArgumentException $e) {
            // 处理可能的配置错误 (例如 bucket 未配置)
             Log::error('OSS Configuration Error: ' . $e->getMessage(), ['exception' => $e]);
             return response()->json(['error' => 'Server configuration error: ' . $e->getMessage()], 500);
        } catch (\Exception $e) {
            // 5. 处理服务抛出的其他异常
            // 服务类已经记录了日志，这里只需要返回错误响应
            return response()->json(['error' => 'Failed to process file upload: ' . $e->getMessage()], 500);
        }
    }

    /**
     * 通过对象名称删除 OSS 文件。
     *
     * @param Request $request
     * @return \Illuminate\Http\JsonResponse
     */
    public function destroyByName(Request $request)
    {
        // 验证请求中必须包含 object_name 字段
        $validated = $request->validate([
            'object_name' => 'required|string'
        ]);

        $objectName = $validated['object_name'];

        try {
            $deleted = $this->ossService->deleteFile($objectName);

            if ($deleted) {
                 return response()->json(['message' => '通过对象名称删除文件成功。']);
            } else {
                 // 通常 deleteFile 成功会返回 true 或抛出异常
                 Log::warning('OssStorageService::deleteFile returned false unexpectedly.', ['object_name' => $objectName]);
                 return response()->json(['error' => '删除文件失败 (未知原因)。'], 500);
            }

        } catch (OssException $e) {
             return response()->json(['error' => '从 OSS 删除文件失败: ' . $e->getMessage()], 500);
        } catch (\InvalidArgumentException $e) {
             return response()->json(['error' => '参数错误: ' . $e->getMessage()], 400);
        } catch (\Exception $e) {
             Log::error('删除文件时发生意外错误 (by name): ' . $e->getMessage(), ['exception' => $e]);
             return response()->json(['error' => '发生意外错误。'], 500);
        }
    }

    /**
     * 通过文件 URL 删除 OSS 文件。
     *
     * @param Request $request
     * @return \Illuminate\Http\JsonResponse
     */
    public function destroyByUrl(Request $request)
    {
        // 验证请求中必须包含 file_url 字段，且必须是有效的 URL
        $validated = $request->validate([
            'file_url' => 'required|url'
        ]);

        $fileUrl = $validated['file_url'];

        try {
            $deleted = $this->ossService->deleteFileByUrl($fileUrl);

            if ($deleted) {
                return response()->json(['message' => '通过 URL 删除文件成功。']);
            } else {
                 Log::warning('OssStorageService::deleteFileByUrl returned false unexpectedly.', ['file_url' => $fileUrl]);
                 return response()->json(['error' => '删除文件失败 (未知原因)。'], 500);
            }

        } catch (OssException $e) {
             return response()->json(['error' => '从 OSS 删除文件失败: ' . $e->getMessage()], 500);
        } catch (\InvalidArgumentException $e) {
            // 包括 URL 不匹配、OSS_URL 未配置等情况
             return response()->json(['error' => '参数或配置错误: ' . $e->getMessage()], 400);
        } catch (\Exception $e) {
             Log::error('删除文件时发生意外错误 (by URL): ' . $e->getMessage(), ['exception' => $e]);
             return response()->json(['error' => '发生意外错误。'], 500);
        }
    }
}
